STM32 电机控制 SDK MCFW-6.4.1
用于构建驱动 STM32 的 PMSM 电机应用的软件开发套件
MC状态机、命令与故障

上一页:位置控制 ↤|目录 |↦ 下一页:FreeRTOS 在电机控制应用中的应用

状态机

电机控制FOC库的运行由下图中突出显示的状态机驱动:

该状态机负责电机启动和停止程序以及库检测到的故障管理。这些州的描述如下表所示。

州际 定义
ICL WAIT 系统正在等待浪涌电流限制器的解除。如果ICL活跃,电机无法运行。系统保持此状态直到ICL停用。然后它进入了闲置状态。
IDLE 电机未受控,但系统已准备好接收“电机控制启动”命令或“测量偏振偏移”命令。
OFFSET MEASUREMENT 测量相电流采集电路的偏振偏移量。如果系统当时不知道偏移量,则在接收到电机控制启动命令后达到该状态。否则,接收到“测量极化偏移”命令即可达到。在这种情况下,测量完成后状态机会回到空闲状态。
CHARGE BOOT CAP 此时,栅极驱动器的引导电容充满电。系统在此状态保持固定且可配置的时间,然后切换到ALIGNMENT、START或RUN状态之一。
ALIGNMENT 只有当使用正交编码器测量转子的速度和位置时,才存在该状态。在此状态下,编码传感器被正确对准以确定转子的机械角度。完成对齐后,状态机进入等待停止电机状态。
WAIT STOP MOTOR 连接到电机的编码器已经对齐,可能还没完全恢复正常。系统在该状态下保持固定且可配置的时间,之后电机被视为静止。然后,如果使用正交编码器或一组霍尔传感器作为主要的速度和位置反馈方法,则切换到运行状态;否则则切换到启动状态。在后者情况下,编码器仅作为“次要”的速度和位置反馈方法使用。
START 系统正在执行电机启动程序。过程完成后,状态机切换到切换切换状态。只有在使用无传感器算法估计转子的位置和转速时,才存在该状态。
SWITCH OVER 在此状态下,系统从电机启动过程中使用的开环模式切换到电机受控的闭环模式。系统随后进入运行状态。
RUN 电机已经受控了。直到发生故障或收到电机控制停止命令,该状态将保持不变。在最后一种情况下,系统进入了停止状态。
STOP 电机的控制装置被释放。该状态在接收到运动控制停止命令时进入。系统在该状态下保持固定且可配置的时间,之后电机被视为静止。系统随后进入IDLE或ICL WAIT状态(如果启用此功能)。
FAULT NOW 该状态是从任何其他状态在发生故障时进入的。只要存在一个主动故障状态,系统就会保持这种状态。当最后一个活跃故障状态消失时,状态机会切换到故障覆盖状态。
FAULT OVER 当至少有一个故障处于激活状态时,系统进入此状态。它会一直留在该系统中,直到收到确认错误的命令。然后它又回到了IDLE或ICL等待状态。

有关这些国家实施的更多细节,请参见MCI_State_t结构的文档。

状态机由电机控制库中的中频任务执行。

在典型应用中,这里描述的所有状态并不存在。上图所示的状态机是考虑MC SDK管理的所有情况的状态。然而,实际应用确实会遇到所有这些问题。例如,在不使用无传感器方法测量转子速度和位置的应用中,和状态不存在。即便如此,只有在使用正交编码器时,和状态才存在。另外,ICL 等待状态只有在使用涌入电流限制器功能时才存在......STARTSWITCH OVERALIGNMENTWAIT STOP MOTOR

每个电机的当前状态可以通过调用 MC_GetSTMStateMotor*() 函数来检索。

指令传递机制

运动控制应用由用户设计。它使用电机控制库来实际控制电机。两者都不运行在同一执行线程上。

电机控制库的状态机由中频任务运行,该任务在SysTick中断时执行(除非使用FreeRTOS,详见MCSDK的FreeRTOS文档以了解此特殊情况)。应用程序不太可能在同一线程上运行。它更被期望以 STM32 用户模式(由工作台Generate的功能)运行,尽管这并非强制要求。然而,命令电机控制库需要注意线程间通信。main()

MCSDK提供的电机控制API为用户实现了这一点。不过使用时有一个限制:它提供的函数不应同时调用。

利用该 API,固件提供了两种机制来在应用程序与中频任务之间交换命令:

  • 直接指令机制
  • 缓冲命令机制

直接指挥

直接命令之所以如此命名,是因为它们几乎在请求后立即执行,无论是否成功。有四个直接命令:

  • 运动控制启动。该命令指示电机控制库将目标电机置于控制之下。它由带有 MC_StartMotor*() 函数的应用程序触发。该命令只有在状态机处于状态时才能执行。IDLE
  • 运动控制停止。该命令指示电机控制库解除对目标电机的控制。它由带有 MC_StopMotor*() 函数的应用程序触发。该命令可在除 和 以外的任何状态下执行。IDLEFAULT NOWFAULT OVER
  • 测量偏振偏移量。该命令指示电机控制库执行偏移偏振测量过程。它由带有 MC_StartPolarizationOffsetsMeasurementMotor* 函数的应用程序触发。该命令只有在状态机处于状态时才能执行。IDLE
  • 承认错误。该命令会确认电机控制库检测到的过去故障。它由 MC_AcknowledgeFaultMotor*() 函数触发。该命令只有在状态机处于状态时才有意义。FAULT OVER

这些函数首先检查目标电机的状态机是否允许其执行。如果不是这样,命令将失败且不会被执行。否则,命令将在下一个中频任务中安排执行。如果此时系统仍处于兼容状态,命令启动,系统切换到合适的状态。

缓冲命令

缓冲命令是指不能瞬时执行的命令:如果系统未处于允许执行的状态,则该命令存储在缓冲区中,当状态机达到适当状态时执行。否则,它将在下一个中频任务中执行。

用于存储这些命令的缓冲区只能存储一个命令。如果在执行前一个命令之前提交了另一个命令,则缓冲区中将前一个命令替换为新的。

有四个缓冲命令。所有执行均为运行状态:

错误报告机制

电机控制库检测到可能发生在电机控制子系统上的多种故障状况。当出现任何此类故障状态时,状态机切换到状态。达到此状态时,电机停止,对其控制权解除。只要故障状态处于激活状态,状态机就会保持该状态。当故障不存在时,状态机切换到状态。然后,应用程序需要通过调用 MC_AcknowledgeFaultMotor*() 函数来确认故障,使状态机返回状态,电机可以再次使用。FAULT NOWFAULT OVERIDLE

多个断层可以同时活跃。在这种情况下,状态机只有在这些故障都不再活跃时才会进入。如果在状态机处于该状态时出现新的故障状态,它会切换回该状态。FAULT OVERFAULT OVERFAULT NOW

可用 MC_GetCurrentFaultsMotor() 函数检索活动故障状态列表。过去(但尚未被承认)的故障可以通过 MC_GetOccurredFaultsMotor() 函数来恢复。这两个函数都会返回位域值,每个位都设置为对应一个故障,无论是激活还是过去。

下表列出电机控制库已知的故障状况及其标志位域值。有关故障代码的详细信息,请参见故障代码

# 名称描述
0x00 NO_FAULTS 没有错误
0x01 DURATION 高频任务未能按时完成。
0x02 OVER_VOLT V_{BUS} 电压是或曾被测量到超过过电压阈值VBUS
0x04 UNDER_VOLT V_{BUS} 电压是或曾测量低于下压阈值VBUS
0x08 OVER_TEMP 系统温度已超过过热阈值
0x10 START_UP 无传感器启动阶段失败了。电机无法在闭环中控制。
0x20 SPEED_FDBK 转子转速的测量或估计不再可靠
0x40 BREAK_IN 相电流是或曾测量到超过过电流阈值
0x80 SW_ERROR 内部软件错误发生了。

上一页:位置控制 ↤|目录 |↦ 下一页:FreeRTOS 在电机控制应用中的应用